package col.edu.uniq.tiendamus.intprins;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.JOptionPane;

public class Tienda {
	protected static ArrayList<Cliente> lstClientes = new ArrayList<Cliente>();
	protected static ArrayList<Factura> lstFacturas = new ArrayList<Factura>();
	protected static ArrayList<Productos> lstProductos = new ArrayList<Productos>();
	protected String clave = "";
	protected static String RUTA_ARCHIVO_CLIENTES = "d:lstClientes.dat";
	protected static String RUTA_ARCHIVO_PRODUCTOS = "d:lstProductos.dat";
	protected static String RUTA_ARCHIVO_FACTURAS= "d:lstFacturas.dat";
	protected int [] uti=new int [3];
	
	public int getConsecutivoFactura() {
		return lstFacturas.size();
	}

	public ArrayList<Cliente> getLstClientes() {
		return lstClientes;
	}

	public void setLstClientes(ArrayList<Cliente> lstClientes) {
		Tienda.lstClientes = lstClientes;
	}

	public ArrayList<Factura> getLstFacturas() {
		return lstFacturas;
	}

	public void setLstFacturas(ArrayList<Factura> lstFacturas) {
		this.lstFacturas = lstFacturas;
	}

	public ArrayList<Productos> getLstProductos() {
		return lstProductos;
	}

	public void setLstProductos(ArrayList<Productos> lstProductos) {
		this.lstProductos = lstProductos;
	}

	public String getClave() {
		return clave;
	}

	public void setClave(String clave) {
		this.clave = clave;
	}

	public static void main(String[] args) {
		Libro libro = new Libro("L001", 230000, "Harry Potter", 3, "Rowding",
				"1234", "2004");
		Dvd dvd = new Dvd("D001", 45000, "Rapido y Furioso 1", 4, "Jackson");
		Cds cd = new Cds("C001", 30000, "Romance", 4, "Luis Miguel", "Sony");
		lstProductos.add(dvd);
		lstProductos.add(libro);
		lstProductos.add(cd);
		Date hoy = new Date();

		TarjetaDebito LstTarjetas[] = new TarjetaDebito[3];
		TarjetaDebito tj = new TarjetaDebito("111222333", hoy, 2000000);
		LstTarjetas[0] = tj;

		Cliente cli = new Cliente("Diego Sanchez", "89003663",
				"Acacias mz 14 casa 4", "315 4983992", LstTarjetas);

		lstClientes.add(cli);

		guardarClientes();
		guardarProductos();
		TiendaPrin tienda = new TiendaPrin();
		tienda.setVisible(true);
	}

	public static void ingresarProducto(Productos pr) {
		lstProductos.add(pr);
	}

	public void ingresarFactura(Factura f) {
		lstFacturas.add(f);

	}

	public void ingresarCliente(Cliente cl) {
		lstClientes.add(cl);
	}

	public void eliminarProducto(Productos pr) {
		lstProductos.remove(pr);
	}

	public Cliente buscarCliente(String cedula) throws Exception {
		if (lstClientes == null) {
			throw new NoEncontroProducto("No hay Clientes Registrados.");
		}
		int posicion = -1;
		for (int i = 0; i < lstClientes.size(); i++) {
			if (lstClientes.get(i).getCedula().equals(cedula)) {
				posicion = i;
			}
		}
		if (posicion < 0) {
			throw new NoEncontroProducto("Cliente no existe.");
		} else {
			Cliente cli = lstClientes.get(posicion);
			return cli;
		}
	}

	public Productos buscarProductoPorCodigo(String codigo) throws Exception {
		if (lstProductos == null) {
			throw new NoEncontroProducto("No hay Productos registrados.");
		}
		int posicion = -1;
		for (int i = 0; i < lstProductos.size(); i++) {
			if (lstProductos.get(i).getCodigo().equals(codigo)) {
				posicion = i;
			}
		}
		if (posicion < 0) {
			throw new NoEncontroProducto();
		} else {
			Productos pr = lstProductos.get(posicion);
			return pr;
		}

	}

	/**
	 * 
	 * Metodo para guardar la lista de Clientes en el archivo de serializacion
	 * 
	 */
	public static void guardarClientes() {
		ObjectOutputStream salida = null;

		try {
			// abre el archivo.

			salida = new ObjectOutputStream(new FileOutputStream(
					RUTA_ARCHIVO_CLIENTES));
			// escribe el arreglo en el archivo.

			salida.writeObject(lstClientes);//se escribre la lista de Clientes
			salida.flush();
			salida.reset();

		} catch (IOException e) {
			e.printStackTrace();

		} finally {// se cierra el archivo.
			if (salida != null) {
				try {
					salida.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		}
	}//cierre metodo grardarClientes

	
	
	/**
	 * Metodo desserializa el archivo que contiene la lista de Clientes
	 * 
	 *
	 */
	public void cargarClientes() throws IOException {
		ObjectInputStream entradaClientes = null;// se crea flujo de entrada
		try {
			FileInputStream f_in = new FileInputStream(RUTA_ARCHIVO_CLIENTES);
			entradaClientes = new ObjectInputStream(f_in);
			lstClientes = (ArrayList<Cliente>) entradaClientes.readObject();// se
																			// guarda
																			// la
																			// lista
																			// de
																			// Clientes
		} catch (FileNotFoundException e) {// Excepcion si no encuentra el
											// archivo
			e.printStackTrace();
			throw new IOException("Clientes");//se lanza excepcion con el mensaje "Clientes"
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {//finally para cerrar el archivo
			if (entradaClientes != null) {
				try {
					entradaClientes.close();// se cierra archivo
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}//cierre metodo cargarClientes

	/**
	 * 
	 * Metodo para guardar la lista de Clientes en el archivo de serializacion
	 * 
	 */
	public static void guardarProductos() {
		ObjectOutputStream salida = null;

		try {
			// abre el archivo.

			salida = new ObjectOutputStream(new FileOutputStream(
					RUTA_ARCHIVO_PRODUCTOS));
			// escribe el arreglo en el archivo.

			salida.writeObject(lstProductos);//se escribre la lista de Productos
			salida.flush();
			salida.reset();

		} catch (IOException e) {
			e.printStackTrace();

		} finally {// se cierra el archivo.
			if (salida != null) {
				try {
					salida.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		}
	}//cierre metodo guardarProductos
	
	/**
	 * Metodo desserializa el archivo que contiene la lista de Productos
	 * 
	 * @param ruta
	 *            donde se encuentra el archivo a leer
	 * 
	 */
	public void cargarProductos() throws IOException {
		ObjectInputStream entradaProductos = null;// se crea flujo de entrada
		try {
			FileInputStream f_in = new FileInputStream(RUTA_ARCHIVO_PRODUCTOS);
			entradaProductos = new ObjectInputStream(f_in);
			lstProductos = (ArrayList<Productos>) entradaProductos.readObject();// se
																			// guarda
																			// la
																			// lista
																			// de
																			// Productos
		} catch (FileNotFoundException e) {// Excepcion si no encuentra el
											// archivo
			e.printStackTrace();
			throw new IOException("Productos");//se lanza excepcion con el mensaje "Productos"
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {//finally para cerrar el archivo
			if (entradaProductos != null) {
				try {
					entradaProductos.close();// se cierra archivo
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}//cierre metodo cargarProductos
	
	/**
	 * 
	 * Metodo para guardar la lista de Facturas en el archivo de serializacion
	 * 
	 */
	public static void guardarFacturas() {
		ObjectOutputStream salida = null;

		try {
			// abre el archivo.

			salida = new ObjectOutputStream(new FileOutputStream(
					RUTA_ARCHIVO_FACTURAS));
			// escribe el arreglo en el archivo.

			salida.writeObject(lstFacturas);//se escribre la lista de Facturas
			salida.flush();
			salida.reset();

		} catch (IOException e) {
			e.printStackTrace();

		} finally {// se cierra el archivo.
			if (salida != null) {
				try {
					salida.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		}
	}//cierre metodo guardarFacturas

	
	
	/**
	 * Metodo desserializa el archivo que contiene la lista de Facturas
	 * 
	 *
	 */
	public void cargarFacturas() throws IOException {
		ObjectInputStream entrada = null;// se crea flujo de entrada
		try {
			FileInputStream f_in = new FileInputStream(RUTA_ARCHIVO_FACTURAS);
			entrada = new ObjectInputStream(f_in);
			lstFacturas = (ArrayList<Factura>) entrada.readObject();// se
																			// guarda
																			// la
																			// lista
																			// de
																			// Facturas
		} catch (FileNotFoundException e) {// Excepcion si no encuentra el
											// archivo
			e.printStackTrace();
			throw new IOException("Facturas");//se lanza excepcion con el mensaje "Facturas"
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {//finally para cerrar el archivo
			if (entrada != null) {
				try {
					entrada.close();// se cierra archivo
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}//cierre metodo cargarFacturas
}
